home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Examples / aux / samples / olympic.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  7.4 KB  |  344 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include <time.h>
  6. #include "tk.h"
  7.  
  8. #define XSIZE    100
  9. #define YSIZE    75
  10.  
  11. #define RINGS 5
  12. #define BLUERING 0
  13. #define BLACKRING 1
  14. #define REDRING 2
  15. #define YELLOWRING 3
  16. #define GREENRING 4
  17.  
  18. #define BACKGROUND 8
  19.  
  20. enum {
  21.     BLACK = 0,
  22.     RED,
  23.     GREEN,
  24.     YELLOW,
  25.     BLUE,
  26.     MAGENTA,
  27.     CYAN,
  28.     WHITE
  29. };
  30.  
  31.  
  32. GLenum rgb, doubleBuffer, directRender;
  33.  
  34. unsigned char rgb_colors[RINGS][3];
  35. int mapped_colors[RINGS];
  36. float dests[RINGS][3];
  37. float offsets[RINGS][3];
  38. float angs[RINGS];
  39. float rotAxis[RINGS][3];
  40. int iters[RINGS];
  41. GLuint theTorus;
  42.  
  43.  
  44. void FillTorus(float rc, int numc, float rt, int numt)
  45. {
  46.     int i, j, k;
  47.     double s, t;
  48.     double x, y, z;
  49.     double pi, twopi;
  50.  
  51.     pi = 3.14159265358979323846;
  52.     twopi = 2 * pi;
  53.  
  54.     for (i = 0; i < numc; i++) {
  55.     glBegin(GL_QUAD_STRIP);
  56.         for (j = 0; j <= numt; j++) {
  57.         for (k = 1; k >= 0; k--) {
  58.         s = (i + k) % numc + 0.5;
  59.         t = j % numt;
  60.  
  61.         x = cos(t*twopi/numt) * cos(s*twopi/numc);
  62.         y = sin(t*twopi/numt) * cos(s*twopi/numc);
  63.         z = sin(s*twopi/numc);
  64.         glNormal3f(x, y, z);
  65.  
  66.         x = (rt + rc * cos(s*twopi/numc)) * cos(t*twopi/numt);
  67.         y = (rt + rc * cos(s*twopi/numc)) * sin(t*twopi/numt);
  68.         z = rc * sin(s*twopi/numc);
  69.         glVertex3f(x, y, z);
  70.         }
  71.         }
  72.     glEnd();
  73.     }
  74. }
  75.  
  76. float Clamp(int iters_left, float t)
  77. {
  78.  
  79.     if (iters_left < 3) {
  80.     return 0.0;
  81.     }
  82.     return (iters_left-2)*t/iters_left;
  83. }
  84.  
  85. void DrawScene(void)
  86. {
  87.     int i, j;
  88.     GLboolean goIdle;
  89.  
  90.     goIdle = GL_TRUE;
  91.     for (i = 0; i < RINGS; i++) {
  92.     if (iters[i]) {
  93.         for (j = 0; j < 3; j++) {
  94.         offsets[i][j] = Clamp(iters[i], offsets[i][j]);
  95.         }
  96.         angs[i] = Clamp(iters[i], angs[i]);
  97.         iters[i]--;
  98.         goIdle = GL_FALSE;
  99.     }
  100.     }
  101.     if (goIdle) {
  102.        tkIdleFunc(NULL);
  103.     }
  104.  
  105.     glPushMatrix();
  106.     
  107.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  108.     gluLookAt(0,0,10, 0,0,0, 0,1,0);
  109.  
  110.     for (i = 0; i < RINGS; i++) {
  111.     if (rgb) {
  112.         glColor3ubv(rgb_colors[i]);
  113.     } else {
  114.         glIndexi(mapped_colors[i]);
  115.     }
  116.     glPushMatrix();
  117.     glTranslatef(dests[i][0]+offsets[i][0], dests[i][1]+offsets[i][1],
  118.              dests[i][2]+offsets[i][2]);
  119.     glRotatef(angs[i], rotAxis[i][0], rotAxis[i][1], rotAxis[i][2]);
  120.     glCallList(theTorus);
  121.     glPopMatrix();
  122.     }
  123.  
  124.     glPopMatrix();
  125.  
  126.     glFlush();
  127.     
  128.     tkSwapBuffers();
  129. }
  130.  
  131. float MyRand(void)
  132. {
  133.  
  134.     return 10.0 * ((((float) rand())/((float) RAND_MAX)) - 0.5);
  135. }
  136.  
  137. void ReInit(void)
  138. {
  139.     int i;
  140.     float deviation;
  141.  
  142.     deviation = MyRand() / 2;
  143.     deviation = deviation * deviation;
  144.     for (i = 0; i < RINGS; i++) {
  145.     offsets[i][0] = MyRand();
  146.     offsets[i][1] = MyRand();
  147.     offsets[i][2] = MyRand();
  148.     angs[i] = 260.0 * MyRand();
  149.     rotAxis[i][0] = MyRand();
  150.     rotAxis[i][1] = MyRand();
  151.     rotAxis[i][2] = MyRand();
  152.     iters[i] = (deviation * MyRand() + 60.0);
  153.     }
  154.     tkIdleFunc(DrawScene);
  155. }
  156.  
  157. void Init(void)
  158. {
  159.     float base, height;
  160.     float aspect, x, y;
  161.     int i;
  162.     float sc = 10;
  163.     float top_y = 1.0;
  164.     float bottom_y = 0.0;
  165.     float top_z = 0.15;
  166.     float bottom_z = 0.69;
  167.     float spacing = 2.5;
  168.     static float lmodel_ambient[] = {0.0, 0.0, 0.0, 0.0};
  169.     static float lmodel_twoside[] = {GL_FALSE};
  170.     static float lmodel_local[] = {GL_FALSE};
  171.     static float light0_ambient[] = {0.1, 0.1, 0.1, 1.0};
  172.     static float light0_diffuse[] = {1.0, 1.0, 1.0, 0.0};
  173.     static float light0_position[] = {0.8660254, 0.5, 1, 0};
  174.     static float light0_specular[] = {1.0, 1.0, 1.0, 0.0};
  175.     static float bevel_mat_ambient[] = {0.0, 0.0, 0.0, 1.0};
  176.     static float bevel_mat_shininess[] = {40.0};
  177.     static float bevel_mat_specular[] = {1.0, 1.0, 1.0, 0.0};
  178.     static float bevel_mat_diffuse[] = {1.0, 0.0, 0.0, 0.0};
  179.  
  180.     srand(3243);
  181.     ReInit();
  182.     for (i = 0; i < RINGS; i++) {
  183.     rgb_colors[i][0] = rgb_colors[i][1] = rgb_colors[i][2] = 0;
  184.     }
  185.     rgb_colors[BLUERING][2] = 255;
  186.     rgb_colors[REDRING][0] = 255;
  187.     rgb_colors[GREENRING][1] = 255;
  188.     rgb_colors[YELLOWRING][0] = 255;
  189.     rgb_colors[YELLOWRING][1] = 255;
  190.     mapped_colors[BLUERING] = BLUE;
  191.     mapped_colors[REDRING] = RED;
  192.     mapped_colors[GREENRING] = GREEN;
  193.     mapped_colors[YELLOWRING] = YELLOW;
  194.     mapped_colors[BLACKRING] = BLACK;
  195.  
  196.     dests[BLUERING][0] = -spacing;
  197.     dests[BLUERING][1] = top_y;
  198.     dests[BLUERING][2] = top_z;
  199.  
  200.     dests[BLACKRING][0] = 0.0;
  201.     dests[BLACKRING][1] = top_y;
  202.     dests[BLACKRING][2] = top_z;
  203.  
  204.     dests[REDRING][0] = spacing;
  205.     dests[REDRING][1] = top_y;
  206.     dests[REDRING][2] = top_z;
  207.  
  208.     dests[YELLOWRING][0] = -spacing / 2.0;
  209.     dests[YELLOWRING][1] = bottom_y;
  210.     dests[YELLOWRING][2] = bottom_z;
  211.  
  212.     dests[GREENRING][0] = spacing / 2.0;
  213.     dests[GREENRING][1] = bottom_y;
  214.     dests[GREENRING][2] = bottom_z;
  215.  
  216.     base = 2.0; 
  217.     height = 2.0;
  218.     theTorus = glGenLists(1);
  219.     glNewList(theTorus, GL_COMPILE);
  220.     FillTorus(0.1, 8, 1.0, 25);
  221.     glEndList();
  222.  
  223.     x = (float)XSIZE;
  224.     y = (float)YSIZE;
  225.     aspect = x / y;
  226.     glEnable(GL_CULL_FACE);
  227.     glCullFace(GL_BACK);
  228.     glEnable(GL_DEPTH_TEST);
  229.     glClearDepth(1.0);
  230.  
  231.     if (rgb) {
  232.     glClearColor(0.5, 0.5, 0.5, 0.0);
  233.     glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
  234.     glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
  235.     glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);
  236.     glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
  237.     glEnable(GL_LIGHT0);
  238.  
  239.     glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
  240.     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  241.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  242.     glEnable(GL_LIGHTING);
  243.  
  244.     glMaterialfv(GL_FRONT, GL_AMBIENT, bevel_mat_ambient);
  245.     glMaterialfv(GL_FRONT, GL_SHININESS, bevel_mat_shininess);
  246.     glMaterialfv(GL_FRONT, GL_SPECULAR, bevel_mat_specular);
  247.     glMaterialfv(GL_FRONT, GL_DIFFUSE, bevel_mat_diffuse);
  248.  
  249.     glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
  250.     glEnable(GL_COLOR_MATERIAL);
  251.     glShadeModel(GL_SMOOTH);
  252.     } else {
  253.     glClearIndex(BACKGROUND);
  254.     glShadeModel(GL_FLAT);
  255.     }
  256.  
  257.     glMatrixMode(GL_PROJECTION);
  258.     gluPerspective(45, 1.33, 0.1, 100.0);
  259.     glMatrixMode(GL_MODELVIEW);
  260. }
  261.  
  262. void Reshape(int width, int height)
  263. {
  264.  
  265.     glViewport(0, 0, width, height);
  266. }
  267.  
  268. GLenum Key(int key, GLenum mask)
  269. {
  270.  
  271.     switch (key) {
  272.       case TK_ESCAPE:
  273.     tkQuit();
  274.       case TK_SPACE:
  275.     ReInit();
  276.     break;
  277.       default:
  278.     return GL_FALSE;
  279.     }
  280.     return GL_TRUE;
  281. }
  282.  
  283. GLenum Args(int argc, char **argv)
  284. {
  285.     GLint i;
  286.  
  287.     rgb = GL_TRUE;
  288.     doubleBuffer = GL_TRUE;
  289.     directRender = GL_TRUE;
  290.  
  291.     for (i = 1; i < argc; i++) {
  292.     if (strcmp(argv[i], "-ci") == 0) {
  293.         rgb = GL_FALSE;
  294.     } else if (strcmp(argv[i], "-rgb") == 0) {
  295.         rgb = GL_TRUE;
  296.     } else if (strcmp(argv[i], "-sb") == 0) {
  297.         doubleBuffer = GL_FALSE;
  298.     } else if (strcmp(argv[i], "-db") == 0) {
  299.         doubleBuffer = GL_TRUE;
  300.     } else if (strcmp(argv[i], "-dr") == 0) {
  301.         directRender = GL_TRUE;
  302.     } else if (strcmp(argv[i], "-ir") == 0) {
  303.         directRender = GL_FALSE;
  304.     } else {
  305.         printf("%s (Bad option).\n", argv[i]);
  306.         return GL_FALSE;
  307.     }
  308.     }
  309.     return GL_TRUE;
  310. }
  311.  
  312. void main(int argc, char **argv)
  313. {
  314.     GLenum type;
  315.     
  316.     srand(clock());
  317.  
  318.     if (Args(argc, argv) == GL_FALSE) {
  319.     tkQuit();
  320.     }
  321.  
  322.     tkInitPosition(30, 60, 400, 300);
  323.  
  324.     type = TK_DEPTH;
  325.     type |= (rgb) ? TK_RGB : TK_INDEX;
  326.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  327.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  328.     tkInitDisplayMode(type);
  329.  
  330.     if (tkInitWindow("Olympic") == GL_FALSE) {
  331.         tkQuit();
  332.     }
  333.  
  334.     Init();
  335.  
  336.     tkExposeFunc(Reshape);
  337.     tkReshapeFunc(Reshape);
  338.     tkKeyDownFunc(Key);
  339.     tkIdleFunc(DrawScene);
  340.     tkDisplayFunc(DrawScene);
  341.  
  342.     tkExec();
  343. }
  344.